home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1995 March / macformat-022.iso / Shareware City / Science / µSim 1.0b5 folder / source / DoEditDialog.c < prev    next >
Encoding:
Text File  |  1994-09-01  |  4.9 KB  |  191 lines  |  [TEXT/MMCC]

  1. /*
  2. Copyright © 1993,1994 by Fabrizio Oddone
  3. ••• ••• ••• ••• ••• ••• ••• ••• ••• •••
  4. This source code is distributed as freeware: you can copy, exchange, modify this
  5. code as you wish. You may include this code in any kind of application: freeware,
  6. shareware, or commercial, provided that full credits are given.
  7. You may not sell or distribute this code for profit.
  8. */
  9.  
  10. //#pragma load "MacDump"
  11.  
  12. #include    "UtilsSys7.h"
  13. #include    "Globals.h"
  14. #include    "Animation.h"
  15. #include    "DoEditDialog.h"
  16. #include    "Main.h"
  17. #include    "Registers.h"
  18. #include    "SimUtils.h"
  19. #include    "Independents.h"
  20. #include    "Conversions.h"
  21.  
  22. #if defined(FabSystem7orlater)
  23.  
  24. #pragma segment Rare
  25.  
  26. static short EditValue(ConstStr255Param str0, ConstStr255Param str1, short edit, short base);
  27. static void EditUserProc(DialogPtr myDPtr, Handle itemHandle, short itemHit);
  28.  
  29. static short    lastChoice;
  30.  
  31. static pascal Boolean EditNumFilter(DialogPtr, EventRecord *, short *);
  32.  
  33. /* DoEditDump: we shall edit a memory location */
  34.  
  35. Boolean DoEditDump(short *addr, short wordn)
  36. {
  37. Str27    tempStr0;
  38. Str15    tempStr1;
  39. register short    new;
  40. register Boolean changed;
  41.  
  42. GetIndHString((Str255 *)&tempStr0, Get1Resource('STR#', kValueFollow), kAtMem);
  43. ShortToHexString(wordn, tempStr1);
  44. new = EditValue(tempStr0, tempStr1, *addr, kPOP_HEX);
  45. if (changed = (new != *addr))
  46.     *addr = new;
  47. return changed;
  48. }
  49.  
  50. /* DoEditDialog: we shall edit a register or an internal processor part */
  51.  
  52. Boolean DoEditDialog(short item, short class, short base)
  53. {
  54. Str27    tempStr0;
  55. Str31    tempStr1;
  56. register short *oldv;
  57. register short    new;
  58. register Boolean changed;
  59.  
  60. GetIndHString((Str255 *)&tempStr0, Get1Resource('STR#', kValueFollow), kInThe);
  61. GetIndHString((Str255 *)&tempStr1, Get1Resource('STR#', class), item);
  62. oldv = class == kPART_NAMES ? &gParts[item] : &gRegs[item];
  63. new = EditValue(tempStr0, tempStr1, *oldv, base);
  64. if (changed = (new != *oldv)) {
  65.     *oldv = new;
  66.     if (class == kPART_NAMES)
  67.         ChangedBox(item);
  68.     }
  69. return changed;
  70. }
  71.  
  72. enum {
  73. kItemEditValue = 3,
  74. kItemPopupBase
  75. };
  76.  
  77. static short EditValue(ConstStr255Param str0, ConstStr255Param str1, short edit, short base)
  78. {
  79.  
  80. enum {
  81. kDLOG_EDITVALUE = 261
  82. };
  83.  
  84. Str255    EditStr;
  85. long    tempLong;
  86.  
  87. dialogItems    things[] = {{ ok, 0, 1L },
  88.                         { cancel, 0, 0L },
  89.                         { kItemEditValue, 0, 0L },
  90.                         { kItemPopupBase, 0, 0L },
  91.                         { 0, 0, 0L}
  92.                         };
  93.  
  94. things[kItemEditValue-1].refCon = (long)&EditStr;
  95. things[kItemPopupBase-1].refCon = base;
  96. tempLong = edit;
  97. lastChoice = base;
  98. ParamText(str0, str1, nil, nil);
  99. FromNumToString(EditStr, edit, base);
  100. //things[kItemEditValue-1].refCon = ;
  101.  
  102. if (HandleDialog(EditNumFilter, things, nil, EditUserProc, kDLOG_EDITVALUE) == ok) {
  103.     tempLong = 0L;
  104.     FromStringToNum((ConstStr255Param)&EditStr, &tempLong, lastChoice);
  105.     }
  106. return tempLong;
  107. }
  108.  
  109. void EditUserProc(DialogPtr myDPtr, Handle itemHandle, short itemHit)
  110. {
  111. Str255    tempStr;
  112. Rect    tempRect;
  113. Handle    tempH;
  114. long    tempnum;
  115. short    null;
  116. register short    newChoice;
  117.  
  118. if (itemHit == kItemPopupBase)
  119.     if ((newChoice = GetCtlValue((ControlHandle)itemHandle)) != lastChoice) {
  120.         GetDItem(myDPtr, kItemEditValue, &null, &tempH, &tempRect);
  121.         GetIText(tempH, tempStr);
  122.         tempnum = 0L;
  123.         FromStringToNum((ConstStr255Param)&tempStr, &tempnum, lastChoice);
  124.         FromNumToString(tempStr, (short)tempnum, newChoice);
  125.         lastChoice = newChoice;
  126.         SetIText(tempH, tempStr);
  127.         SelIText(myDPtr, kItemEditValue, 0, 0x7FFF);
  128.         }
  129. }
  130.  
  131. /* EditNumFilter: the filter filters entered characters, of course */
  132.  
  133. static pascal Boolean EditNumFilter(DialogPtr theD, EventRecord *thEv, short *iHit)
  134. {
  135. GrafPtr    savePort;
  136. unsigned char    keypressed;
  137. register Boolean    retVal;
  138.  
  139. switch(thEv->what) {
  140.     case keyDown    :
  141.     case autoKey    :
  142.         keypressed = CHARFROMMESSAGE(thEv->message);
  143.         if (lastChoice != kPOP_TEXT) {
  144.             if ((keypressed >= 'a') && (keypressed <= 'z')) {
  145.                 keypressed -= 'a' - 'A';    /* cambiare! */
  146.                 CHARFROMMESSAGE(thEv->message) = keypressed;
  147.                 }
  148.             if ((keypressed >= 32) && (keypressed != 0x7F) && ((thEv->modifiers & cmdKey) == 0)) {
  149.                 *iHit = kItemEditValue;
  150.                 switch( lastChoice ) {
  151.                     case kPOP_DEC:    return( Munger((Handle)GetString(kSTR_DECALLOWED), 1L,
  152.                                             &keypressed, 1L, 0L, 0L) < 0L );
  153.                                     break;
  154.                     case kPOP_HEX:    return( Munger((Handle)GetString(kSTR_HEXALLOWED), 1L,
  155.                                             &keypressed, 1L, 0L, 0L) < 0L );
  156.                                     break;
  157.                     case kPOP_OCT:    return( Munger((Handle)GetString(kSTR_OCTALLOWED), 1L,
  158.                                             &keypressed, 1L, 0L, 0L) < 0L );
  159.                                     break;
  160.                     case kPOP_BIN:    return( Munger((Handle)GetString(kSTR_BINALLOWED), 1L,
  161.                                             &keypressed, 1L, 0L, 0L) < 0L );
  162.                                     break;
  163.                     }
  164.                 }
  165.             }
  166.         break;
  167.     case updateEvt:
  168.         if (theD != (DialogPtr)thEv->message) {
  169.             DoUpdate(thEv);
  170.             *iHit = kfakeUpdateItem;
  171.             return true;
  172.             }
  173.         break;
  174.     case activateEvt:
  175.         if (theD != (DialogPtr)thEv->message) {
  176.             DoActivate(thEv);
  177.             *iHit = kfakeUpdateItem;
  178.             return true;
  179.             }
  180.         break;
  181.     }
  182. GetPort(&savePort);
  183. SetPort(theD);
  184. retVal = StdFilterProc(theD, thEv, iHit);
  185. SetPort(savePort);
  186. return retVal;
  187. }
  188.  
  189. #endif
  190.  
  191.